/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：JointLocator.js<br>
 * 日期：2016年11月9日<br>
 * 作者: 王志远<br>
 * 功能：节点定位器<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/

window.makeNamespace(window,"Rainier.UI.V2");

/**
 * 类型名称：Rainier.UI.V2.JointLocator<br>
 * 类型功能：节点定位器<br>
 */
Rainier.UI.V2.JointLocator = draw2d.layout.locator.ConnectionLocator.extend({
	
	NAME : "Rainier.UI.V2.JointLocator",
	
	/**
	 * 函数名称：Rainier.UI.V2.JointLocator.init<br>
	 * 函数功能：构造函数<br>
	 * 异常信息：无<br>
	 */
	init : function(){
		this._super();
	},

	/**
	 * 函数名称：Rainier.UI.V2.JointLocator.relocate<br>
	 * 函数功能：重新定位图元<br>
	 * 参数输入：index:Number图元编号<br>
	 * 参数输入：target:draw2d.Figure重新定位的图元<br>
	 * 函数返回：<br>
	 * 异常信息：<br>
	 */
    relocate : function(index, target){
   	
       var conn     		 = target.getParent();
       var jointAttachedSegs = target.getAttachedSegments();
       
       //如果节点只关联了一条线段，表示节点在线段的“中间”位置
       if(jointAttachedSegs.getSize() === 1){
    	   var seg = jointAttachedSegs.get(0);
    	   //垂线
    	   if(Math.abs(seg.start.x - seg.end.x) < 0.00001){
    		   var DIR_UP   = 1; //start.y > end.y
    		   var DIR_DOWN = 2; //start.y < end.y
    		   var targetPosX = seg.start.x-target.width/2;
    		   var targetPosY = target.y;
    		   var dir        = -1;
    		   
    		   //todos:判断target的y位置是否超出了线段范围，调整target的y位置
    		   if(seg.start.y < seg.end.y){
    			   dir = DIR_UP;
    			   if(target.offset){    				   
    				   targetPosY = seg.start.y + target.offset - target.width/2;
    			   }
    		   }else{
    			   dir = DIR_DOWN;
    			   if(target.offset){    				   
    				   targetPosY = seg.start.y - target.offset - target.width/2;
    			   }
    		   }
    		   
    		   if(dir === DIR_UP){
    			   if(targetPosY < seg.start.y){
    				   targetPosY = seg.start.y - target.height/2;
    			   }else if(targetPosY > seg.end.y){
    				   targetPosY = seg.end.y - target.height/2;
    			   }
    		   }else if(dir === DIR_DOWN){
    			   if(targetPosY > seg.start.y){
    				   targetPosY = seg.start.y - target.height/2;
    			   }else if(targetPosY < seg.end.y){
    				   targetPosY = seg.end.y - target.height/2;
    			   }
    		   }
    		   if(targetPosX === target.x && targetPosY === target.y){
    			   return;
    		   }
        	   target.setPosition(targetPosX,targetPosY);
    	   }    	   
    	   //水平线
    	   else if(Math.abs(seg.start.y - seg.end.y) < 0.00001){
    		   var DIR_RIGHT = 1;
    		   var DIR_LEFT  = 2;
    		   var dir       = -1;
    		   var targetPosY= seg.start.y-target.height/2;
    		   var targetPosX= target.x;
    		   
    		   //todos:判断target的x位置是否超出了线段范围，调整target的x位置
    		   if(seg.start.x > seg.end.x){
    			   dir = DIR_RIGHT;
    			   if(target.offset){    				   
    				   targetPosX = seg.start.x - target.offset - target.width/2;
    			   }
    		   }else{
    			   dir = DIR_LEFT;
    			   if(target.offset){    				   
    				   targetPosX = seg.start.x + target.offset - target.width/2;
    			   }
    		   }
    		   
    		   if(dir === DIR_RIGHT){
    			   if(targetPosX > seg.start.x){
    				   targetPosX = seg.start.x - target.width/2;
    			   }else if(targetPosX < seg.end.x){
    				   targetPosX = seg.end.x - target.width/2;
    			   }
    		   }else if(dir === DIR_LEFT){
    			   if(targetPosX < seg.start.x){
    				   targetPosX = seg.start.x - target.width/2;
    			   }else if(targetPosX > seg.end.x){
    				   targetPosX = seg.end.x - target.width/2;
    			   }
    		   }
    		   if(targetPosX === target.x && targetPosY === target.y){
    			   return;
    		   }
        	   target.setPosition(targetPosX,targetPosY);
    	   }
       }
       
       //如果节点只关联了一条线段，表示节点在线段的端点位置
       if(jointAttachedSegs.getSize() === 2){
    	   var seg1 = jointAttachedSegs.get(0);
    	   var seg2 = jointAttachedSegs.get(1);
    	   var comPoint = this.calculateCommonPoint(seg1,seg2);
    	   target.setPosition(comPoint.x-target.width/2,comPoint.y-target.height/2);
       }       
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.JointLocator.calculateCommonPoint<br>
	 * 函数功能：求两个线段的交点<br>
	 * 函数返回：Point<br>
	 * 异常信息：<br>
	 */
    calculateCommonPoint : function(seg1,seg2){
    	if(this.isSamePoint(seg1.start,seg2.start)){
    		return seg1.start;
    	}
    	if(this.isSamePoint(seg1.start,seg2.end)){
    		return seg1.start;
    	}
    	if(this.isSamePoint(seg1.end,seg2.start)){
    		return seg1.end;
    	}
    	if(this.isSamePoint(seg1.end,seg2.end)){
    		return seg1.end;
    	}
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.JointLocator.isSamePoint<br>
	 * 函数功能：计算两个点是否相等<br>
	 * 函数返回：boolean<br>
	 * 异常信息：<br>
	 */
    isSamePoint : function(p1,p2){
    	if(p1.x === p2.x && p1.y === p2.y){
    		return true;
    	}
    	return false;
    }
});